//
//  LauBaseViewController.swift
//  SwiftProject
//
//  Created by Lausen on 2017/7/9.
//  Copyright © 2017年 id. All rights reserved.
//

import UIKit

/*
 Swift中,利用extension可以把'函数'按照功能分类管理,便于阅读和维护!
 注意:
 1:extension中不能有属性
 2:extension中不能重写父类的方法,重写父类的方法,是子类的职责,扩展是对类的扩展
 */
//MARK: -- 所有控制器的基类
class LauBaseViewController: UIViewController {

    //由于每个控制器都有一个tableView那么就在根类里面添加一个tableView的属性,当用户没有登录的时候,是不需要表格视图的
    var tableView: UITableView?
    
    //如果用户没有登录,那么就直接显示访客视图
    var vistorInfoDict: [String: String]?
    
    //这个是刷新空间,
    var refreshControl: UIRefreshControl?
    
    ///是否上拉
    lazy var isPullUp: Bool = false
    
    //懒加载一个导航条
    lazy var navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.cz_screenWidth(), height: 64))
    
    //懒加载一个导航条目
    lazy var navItem = UINavigationItem()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupUI()
        // 用户登录了才去加载数据,不登录不用加载数据
        LauNetworkManager.shared.userLogon ? loadData() : ()
        
        //2:注册登录成功的监听
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(loginSuccess),
                                               name: NSNotification.Name(rawValue: LauUserLoginSuccessNotification),
                                               object: nil)
    }
    
    //MARK: -- 析构方法,销毁通知的监听
    deinit {
        
        NotificationCenter.default.removeObserver(self)
    }
    
    //MARK: -- 刷新的方法,交给子类来实现
    func loadData() -> Void {
        //如果子类不实现,就自动关闭刷新
        refreshControl?.endRefreshing()
    }
    
    //重写控制器的title属性,给导航条目的title赋值
    override var title: String?{
        
        didSet{
        
            navItem.title = title
        }
    }
}

extension LauBaseViewController{
    
    @objc fileprivate func loginSuccess(n: Notification){
        
        //将登录视图的navItem的左右item设置为nil
        navItem.leftBarButtonItem = nil
        navItem.rightBarButtonItem = nil
        
        print("登录成功的通知 \(n)")
        
        //当让view = nil的时候,再次执行view的getter方法时,会重新执行loadView以及视图声明周期的方法
        view = nil
        
        //如果走到了viewDidLoad时,通知会重复注册,那么就需要再次销毁
        NotificationCenter.default.removeObserver(self)
    }
    
    @objc fileprivate func login(){
    
        //发送一个通知
        NotificationCenter.default.post(name: NSNotification.Name(rawValue: LauUserShouldLoginNotification), object: nil)
    }
    
    @objc fileprivate func register(){
        
        print("点击了注册按钮")
    }
}

//MARK: -- 设置界面
extension LauBaseViewController{
    
    fileprivate func setupUI(){
        
        view.backgroundColor = UIColor.white
        
        setupNavigationbar()
        
        //如果登录了就设置表格视图,如果没有登录就设置访客视图
        LauNetworkManager.shared.userLogon ? setupTableView() : setupVistorView()
    }
    
    //MARK: -- 添加tableView
    func setupTableView () -> Void{
        
        //取消自动缩进
        automaticallyAdjustsScrollViewInsets = false
        
        tableView = UITableView(frame: view.bounds, style: .plain)
        
        view.insertSubview(tableView!, belowSubview: navigationBar)
        
        //设置tableView的内间距
        tableView?.contentInset = UIEdgeInsets(top: navigationBar.bounds.height,
                                               left: 0,
                                               bottom: tabBarController?.tabBar.bounds.height ?? 49,
                                               right: 0)
        
        //设置表格视图指示器的缩进
        tableView?.scrollIndicatorInsets = tableView!.contentInset
        
        tableView?.delegate = self
        tableView?.dataSource = self
        
        //实例化刷新空间
        refreshControl = UIRefreshControl()
        if #available(iOS 10.0, *) {
            tableView?.refreshControl = refreshControl
        } else {
            // Fallback on earlier versions
        }
        
        refreshControl?.addTarget(self, action: #selector(loadData), for: .valueChanged)
    }
    
    //MARK: -- 设置访客视图
    private func setupVistorView() -> (){
        
        let vistorView = LauVistorView(frame: view.bounds)
        
        vistorView.vistorInfo = vistorInfoDict
        
        view.insertSubview(vistorView, belowSubview: navigationBar)
        
        ///给访客视图里面的登录注册按钮添加点击事件的监听
        vistorView.loginButton.addTarget(self, action: #selector(login), for: .touchUpInside)
        vistorView.registerButton.addTarget(self, action: #selector(register), for: .touchUpInside)
        
        navItem.leftBarButtonItem = UIBarButtonItem(title: "登录", style: .plain, target: self, action: #selector(login))
        navItem.rightBarButtonItem = UIBarButtonItem(title: "注册", style: .plain, target: self, action: #selector(register))
    }
    
    //MARK: -- 设置导航条
    private func setupNavigationbar() -> (){
        
        ///将导航条添加到view上去
        view.addSubview(navigationBar)
        
        ///将导航条目添加到导航条上去
        navigationBar.items = [navItem]
        
        //1>设置导航条的透明度(防止导航栏的右上角出现闪白)
        navigationBar.barTintColor = UIColor.cz_color(withHex: 0xF6F6F6)
        //2>设置title的字体颜色
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.darkGray]
        //3>设置item的字体颜色
        navigationBar.tintColor = UIColor.orange
    }
}

//MARK: -- tableView 的代理方法
extension LauBaseViewController:UITableViewDelegate,UITableViewDataSource{
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return 0
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        return UITableViewCell()
    }
    
    
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        
        //1:获取当前行数
        let currentRow = indexPath.row
        
        //2:获取最大的组数
        let section = tableView.numberOfSections - 1
        
        //3:获取最大组数里面的最大行数
        let maxRow = tableView.numberOfRows(inSection: section) - 1
        
        if section < 0 || maxRow < 0 {
            
            return
            
        }else if (currentRow == maxRow && !isPullUp){
            
            isPullUp = true
            
            loadData()
        }
    }
}

















